←
▼
▲
GetWScriptArgumentsNamed
ソース
テスト
→ vbslib.vbs
コマンドラインのオプション引数
を返します。
Function GetWScriptArgumentsNamed( OptionName as string ) as string
【引数】
OptionName
返り値
コマンドラインに指定するオプションの名前
オプションの値
VBScript WSH を起動するコマンドラインの引数にダブルクォーテーションを含めることはできませんが、
本関数によるエスケープ文字の処理をすることで引数にダブルクォーテーションを含めることができます。
参考
ダブルクォーテーションの指定方法
→ T_CmdLine.vbs
T_GetWScriptArgumentsUnnamed
←
▼
▲
ParseWScriptArgumentQuotation
Function ParseWScriptArgumentQuotation( Value as string ) as string
【引数】
Value
返り値
WScript.Arguments に入っている値
エスケープ文字の処理をした Value
に入っている値に、エスケープ文字の処理をしたものを返します。
参考
ソース
→ T_CmdLine.vbs
テスト
T_ParseWScriptArgumentQuotation
→ vbslib.vbs
VBScript WSH を起動するコマンドラインの引数にダブルクォーテーションを含めることはできませんが、
本関数によるエスケープ文字の処理をすることで引数にダブルクォーテーションを含めることができます。
ダブルクォーテーションの指定方法
←
▼
▲
(src)
Function ArrayFromBashCmdLine( CmdLine as string ) as array of string
bash シェルのコマンドラインの1行を解析して、それぞれの項目を配列に格納する。
の bash 版です。
→ T_CmdLine.vbs # [T_ArrayFromBashCmdLine]
テスト
←
▼
▲
の bash 版です。
→ T_CmdLine.vbs # [T_ArrayFromBashCmdLine]
テスト
(src)
bash シェルのコマンドラインの1項目を取り出し、通常の文字列に戻す。
Function MeltBashCmdLine( Line as string, in_out_Start as integer ) as string
←
▼
▲
Function CmdLineFromStr( Str as string or array ) as string
文字列、または文字列の配列から、コマンドラインを作成します。
【引数】
Str
文字列、または文字列の配列
返り値
コマンドライン
ファイル:
vbslib.vbs
サンプル
cmd = CmdLineFromStr( Array( "findstr", "/C:""quot and space""", "*" ) )
Assert cmd = "findstr ""/C:\""quot and space\"""" *"
→ T_CmdLine.vbs # [T_CmdLineFromStr]
テスト
それぞれの配列要素は、空白で区切ります。
文字列に空白や >, <, ^, | 記号を含むときは、" " で囲みます。
文字列にダブル・クォーテーションや \ 記号があるときは、それらの文字が、これから
起動するプログラムに渡るように \ を追加します。
・
・
ソース
→ vbslib.vbs
関連
←
▼
▲
Function GetCmdLine() as string
現在のスクリプトを起動したときのコマンドラインを返します。
(src)
実行ファイル名と、パラメーターの両方を含みます。
関連
←
▼
▲
Function ArgumentExist( Name as string ) as boolean
【引数】
Name
コマンドライン・オプション名
返り値
オプションが指定されているかどうか
指定した名前のコマンドライン・オプションが指定されているかどうかを返します。
/Opt1:1 ではなく /Opt1 では、WScript.Arguments.Named.Item("Opt1") は
Empty を返し、/Opt1 を指定しなかったときと、区別ができません。
ArgumentExist は、区別ができます。
Name の大文字小文字は区別します。
(src)
WScript.Arguments.Named.Item( "Opt1" )
If ArgumentExist( "Opt1" ) Then ...
サンプル:
→ GetArgvNamed (clib)
関連
WScript.Arguments.Unnamed(0)
→ GetCommandLineExist (clib)
パラメーターが必須のオプションには、ArgumentExist を呼ぶ必要はありません。
WScript.Arguments.Named( "Opt1" )
←
▼
▲
(src)
Function GetCommandLineOptionName( OneParameter as string ) as string
オプション名+値から、オプション名を返します。
【引数】
OneParameter
返り値
オプション名+値
オプション名
サンプル:
name = GetCommandLineOptionName( "/OptionA:12" )
'// name = "OptionA"
→ T_CmdLine.vbs # [T_CommandLineOption]
テスト
←
▼
▲
(src)
Function GetCommandLineOptionValue( OneParameter as string ) as string
オプション名+値から、値を返します。
【引数】
OneParameter
返り値
オプション名+値
値
サンプル:
value = GetCommandLineOptionValue( "/OptionA:12" )
'// value = "12"
value = GetCommandLineOptionValue( "/OptionA:""C:\Program Files""" )
'// value = "C:\Program Files"
→ T_CmdLine.vbs # [T_CommandLineOption]
テスト
←
▼
▲
コマンドラインの1行にある、オプションの値を変更します。
Function ModifyCmdLineOpt( CmdLine as string,
OptionName as string, NewOptionNameAndParam as string ) as string
【引数】
CmdLine
NewOptionNameAndParam
コマンドラインの1行
オプション名と、変更後の値。 削除=Empty
OptionName
オプション名
(出力) 変更後のコマンドラインの1行
返り値
new_cmdline = ModifyCmdLineOpt( "-Opt1 -Opt2:ValueA Value1", "-Opt2", "-Opt2:ValueB" )
Assert new_cmdline = "-Opt1 -Opt2:ValueB Value1"
サンプル
new_cmdline = ModifyCmdLineOpt( "-Opt1 -Opt2:ValueA Value1", "-Opt2", Empty )
Assert new_cmdline = "-Opt1 Value1"
new_cmdline = ModifyCmdLineOpt( "-Opt1 Value1", "-Opt2", "-Opt2:ValueB" )
Assert new_cmdline = "-Opt1 -Opt2:ValueB Value1"
-Opt2 オプションの値を変更する
-Opt2 オプションを無くす
-Opt2 オプションがなければ追加する
-Opt2 オプションと、その値の間が空白のときは、OptionNmae 引数の末尾に ":"(コロン)を付ける
new_cmdline = ModifyCmdLineOpt( "-Opt1 -Opt2 ValueA Value1", "-Opt2:", "-Opt2 ValueB" )
Assert new_cmdline = "-Opt1 -Opt2 ValueB Value1"
複数指定できる -o オプションを追加するときは、OptionNmae 引数の末尾に "::"(コロン×2)を付ける
new_cmdline = ModifyCmdLineOpt( "-o ValueA -o ValueB Value1", "-o::", "-o NewValue" )
Assert new_cmdline="-o NewValue -o ValueA -o ValueB Value1"
new_cmdline = ModifyCmdLineOpt( "-o ValueA -o ValueB Value1", "-o::ValueB", "-o NewValue" )
Assert new_cmdline = "-o ValueA -o NewValue Value1"
複数指定できる -o オプションを修正/削除するときは、OptionNmae 引数の末尾に "::"(コロン×2)
と値を付ける
new_cmdline = ModifyCmdLineOpt( "-o ValueA -o ValueB Value1", "-o::ValueB", Empty )
Assert new_cmdline = "-o ValueA Value1"
(src)
→ T_CmdLine.vbs # [T_ModifyCmdLineOpt]
テスト
←
▼
▲
移植性を持たせつつ将来のバージョンで関数の引数を追加できるようにしたいときは、
下記の引数を検討するとよいでしょう。
ビットフラグ引数
オプション引数(配列)
移植性を持たせつつ引数の数を変更したいときは、
新しく関数名を "<従来の関数名>Ex" にするか、
古い関数名を "<従来の関数名>_Old" にするとよいでしょう。
←
▼
▲
Sub Main()
Set c = get_SampleConsts()
echo FuncA( c.Bit0 )
echo FuncA( c.Bit1 )
echo FuncA( c.Bit0 or c.Bit1 )
echo FuncA( 0 )
echo FuncA( Empty )
End Sub
Function FuncA( BitFlags )
Set c = get_SampleConsts()
s = ""
If IsBitSet( BitFlags, c.Bit0 ) Then s = s + "A"
If IsAnyBitsSet( BitFlags, c.Bit0 or c.Bit1 ) Then s = s + "B"
If IsAllBitsSet( BitFlags, c.Bit0 or c.Bit1 ) Then s = s + "C"
If IsBitNotSet( BitFlags, c.Bit0 ) Then s = s + "a"
If IsAnyBitsNotSet( BitFlags, c.Bit0 or c.Bit1 ) Then s = s + "b"
If IsAllBitsNotSet( BitFlags, c.Bit0 or c.Bit1 ) Then s = s + "c"
FuncA = s
End Function
'*************************************************************************
' <<< [get_SampleConsts] >>>
'*************************************************************************
Dim g_SampleConsts
Function get_SampleConsts()
If IsEmpty( g_SampleConsts ) Then _
Set g_SampleConsts = new SampleConsts
Set get_SampleConsts = g_SampleConsts
End Function
Class SampleConsts
Public Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6, Bit7, Bit8, Bit9
Public Bit10, Bit11, Bit12, Bit13, Bit14, Bit15, Bit16, Bit17, Bit18, Bit19
Public Bit20, Bit21, Bit22, Bit23, Bit24, Bit25, Bit26, Bit27, Bit28, Bit29
Public Bit30, Bit31
Private Sub Class_Initialize()
Bit0 = &h0001
Bit1 = &h0002
Bit2 = &h0004
Bit3 = &h0008
Bit4 = &h0010
Bit5 = &h0020
Bit6 = &h0040
Bit7 = &h0080
Bit8 = &h0100
Bit9 = &h0200
Bit10 = &h0400
Bit11 = &h0800
Bit12 = &h1000
Bit13 = &h2000
Bit14 = &h4000
Bit15 = CLng("&h8000")
Bit16 = &h00010000
Bit17 = &h00020000
Bit18 = &h00040000
Bit19 = &h00080000
Bit20 = &h00100000
Bit21 = &h00200000
Bit22 = &h00400000
Bit23 = &h00800000
Bit24 = &h01000000
Bit25 = &h02000000
Bit26 = &h04000000
Bit27 = &h08000000
Bit28 = &h10000000
Bit29 = &h20000000
Bit30 = &h40000000
Bit31 = &h80000000
End Sub
Public Function ToStr( Number )
Select Case Number
Case Bit0 : ToStr = "Bit0"
Case Bit1 : ToStr = "Bit1"
'// ...
End Select
End Function
End Class
Function IsBitSet( Variable as integer, ConstValue as integer ) as integer
1つのビットが立っているかどうかを判定します。
【引数】
Variable
ConstValue
調べる対象のビット・フィールド値
調べる位置のビットを1にしたビット・フィールド値
OrConstValue
調べる位置の複数のビットを1にしたビット・フィールド値
サンプル
ソース
複数のビットのうち1つ以上が立っているかどうかを判定します。
Function IsAnyBitsSet( Variable as integer, OrConstValue as integer ) as integer
複数のビットのすべてが立っているかどうかを判定します。
Function IsAllBitsSet( Variable as integer, OrConstValue as integer ) as integer
1つのビットが立っていないかどうかを判定します。
Function IsBitNotSet( Variable as integer, ConstValue as integer ) as integer
複数のビットのうち1つ以上が立っていないかどうかを判定します。
Function IsAnyBitsNotSet( Variable as integer, OrConstValue as integer ) as integer
複数のビットのすべてが立っていないかどうかを判定します。
Function IsAllBitsNotSet( Variable as integer, OrConstValue as integer ) as integer
判定結果 (0以外=True、0=False)、論理型ではありません
返り値
→ T_Var.vbs
テスト
T_IsBitSet
→ vbslib.vbs
関連
参考
→ ビット演算
←
▼
▲
Set object = new SampleClass
FuncA Array( &h0001 or &h0002, "ABC", object )
Sub FuncA( in_out_Options )
ParseOptionArguments in_out_Options
Assert in_out_Options("integer") = &h0001 or &h0002
Assert in_out_Options("string") = "ABC"
Assert in_out_Options("SampleClass") Is object
Assert not in_out_Options.Exists("NotPassedType")
option_flags = in_out_Options("integer")
If in_out_Options.Exists("SampleClass") Then
Set options = in_out_Options("SampleClass")
Else
Set options = new SampleClass
End If
End Sub
Sub ParseOptionArguments( in_out_Options as variant )
引数に指定した配列型のオプション引数を辞書型に変換します。 キーは要素の型名です。
【引数】
(入力) 任意の型の変数や配列や辞書やEmpty、(出力) 辞書
サンプル
ソース
→ T_Var.vbs
テスト
T_ParseOptionArguments
→ vbslib.vbs
キーは、大文字小文字を区別しません。
整数型(integer, byte, long)のアイテムに対応するキーは、"integer" です。
浮動小数型(single, double)のアイテムに対応するキーは、"float" です。
その他の型は、
の返り値がキーになります。 例: NameOnlyClass
ParseOptionArguments は、オプション引数(オプション的な引数)を扱いやすくします。
ユーザーは、オプションを指定しないときは Empty を渡します。
オプションを1つ以上指定するときは、配列型にまとめて渡します。
オプションを1つ指定するときは、配列に入れなくても構いません。
処理が開始されると、本関数によって、オプション引数は型をキーとした辞書に変換されます。
in_out_Options 引数に辞書を指定したときは、何もしません。
入力した配列に含まれない型をキーに指定した場合、アイテムは Empty になります。
サンプル
FuncA 123
Sub FuncA( in_out_Options )
ParseOptionArguments in_out_Options
Assert in_out_Options("integer") = 123
End Sub
オプション引数をそのまま関数呼び出しに渡しているときは、辞書型に置き換わって返ってくる
可能性があります。 そして、その変数が再びオプション引数に渡される可能性があります。
ですので、必ず ParseOptionArguments を呼び出した後で、辞書のキーの有無からオプション
の有無を判定してください。
オプション引数を直接 TypeName 関数などで判定しないでください。
キーワード:
ArrayClass 型のアイテムに対応するキーは、"ArrayClass" ですが、配列型のアイテムに
対応するキーはできません。 配列は、上記のとおり複数のオプションをまとめるものとして
処理します。
←
▼
▲
Sub include( path as string )
path に環境変数を含めることができます。 (%var% 形式)
クラス定義や関数定義が入った VBS ファイルのパスを指定します。
VBS ファイルで定義されたグローバル変数や関数は、include を呼び出した
関数の外から参照することはできません。
include "%ProgramFiles%\Movie Maker\moviemk.vbs"
関数定義やクラス定義が入った VBSファイルをインクルードします。
呼び出し先に関数を実行するときのカレントフォルダは、そのスクリプト
ファイルがあるフォルダになります。
path に相対パスを指定するときは注意が必要です。
二重定義エラーが出るときの対策
インクルードする vbs ファイルに、すでに定義されているクラスの
定義があると、エラーになります。クラスは、インスタンスに影響する
ため上書きできません。 (関数は上書きできます)
二重にインクルードしないようにするか、クラス定義だけ1回だけ
インクルードするファイルに分割してください。
Dim g_TestClass : If IsEmpty( g_TestClass ) Then _
include "TestClass.vbs" : g_TestClass = True
サンプル: 1回だけインクルードする
フォルダのパスを指定したり、ワイルドカードを指定すると、サブフォルダも
含めて include します。 ただし、フォルダのパスだけを指定した場合は、
*_obj.vbs ファイルだけ include します。
objs フォルダのサブフォルダも含めて、*_obj.vbs を include します
include "objs"
関連
テスト
→ T_Include.vbs # [main2]
サンプル
サンプル
include は、
の内部からも呼ばれます。
→ vbs_inc_sub.vbs
ソース
→ vbslib_mini.vbs
←
▼
▲
SectionTree オブジェクトを使って、全体の処理を複数のセクションに分割すると、途中のセクション
から実行することができるようになります。
たとえば、1つの関数の中で、複数のテストを連続して行っているとき、1つ1つのテストをセクションに
分けておくと、失敗したテストから実行させることができるようになります。
Sub Test_start( tests )
Set section = new SectionTree
'//SetStartSectionTree "T_Sample2"
'// 一部のセクションだけ実行するときは有効にする
'//===========================================================
If section.Start( "T_Sample1" ) Then
'// ここは実行されません
End If : section.End_
'// section.Start 〜 End_ の外は、常に実行する
If section.Start( "T_Sample2" ) Then
'// ここから実行されます
End If : section.End_ '// ここで、「終了しました」と確認メッセージが表示される
If section.Start( "T_Sample2" ) Then
'// ここも実行されます
End If : section.End_
Pass
End Sub
サンプル
T_Sample2
(src)
ネストしているとき
サンプル
Sub Test_start( tests )
SetStartSectionTree "Sec1, SubSec2"
Dim section : Set section = new SectionTree
If section.Start( "Sec1" ) Then
If section.Start( "SubSec2" ) Then
'// ここは実行されます
End If : section.End_
End If : section.End_
Pass
End Sub
テスト
(各メソッドを参照)
サンプル画面
Section> Sec1
<Section tree="Sec1">
Section> Sec1 > SubSec2
<Section tree="Sec1,SubSec2">
:
</Section>
</Section>
サンプル画面
Section> T_Sample2
<Section tree="T_Sample2">
:
</Section>
セクションの開始と終了で、現在のセクションの位置(親のツリーノードのセクション名から現在まで)
を表示します(下記、サンプル画面)。
関連
←
▼
▲
Function SectionTree::Start( SectionName as string ) as boolean
セクションの開始を指定します。
ファイル:
vbslib.vbs
【引数】
SectionName
返り値
セクション名
セクションを実行するかどうか
テスト
→ T_SectionTree.vbs # [T_SectionTree_1]
→ T_SectionTree.vbs # [T_SectionTree_2]
→ T_SectionTree.vbs # [T_SectionTree_Err]
(src)
→ T_SectionTree.vbs # [T_SectionTree_0]
デバッグ用に、本関数の中から呼び出すコールバック関数を登録できます。
←
▼
▲
Sub SectionTree::End_()
セクションの終了を指定します。
ファイル:
vbslib.vbs
テスト
(src)